<?php
/**
 * klasa kontrolera - pana i władcy całej aplikacji
 * 
 * klasa jest abstrakcyjna z prostego powodu - nie powinna istnieć ani jedna instancja, a bawić się z implementacją wzorca singleton nie ma sensu
 * w sensie realizować wzorzec singleton można w PHP poprzez abstrakcyjną klasę ze wszystkimi polami i metodami statycznymi
 */
abstract class Controller {
	/**
	 * nazwa domyślnej kategorii
	 * @var string
	 * @access private
	 * @static
	 */
	private static $defaultCategory = '';
	/**
	 * aktualna kategoria (ścieżka do niej) prezentowana w postaci tablicy
	 */
	private static $category = false;
	/**
	 * w niektórych przypadkach potrzebny jest numer jakiegoś elementu
	 * 
	 * używane w szeczególności przy obsłudze pojedynczych ogłoszeń
	 */
	private static $number = 0;
	/**
	 * alias ogłoszenia
	 */
	private static $ad = false;
	/**
	 * miejsce na dane przekazywane widokowi
	 */
	private static $data;
	/**
	 * metoda startująca całą aplikację 
	 */
	public static function start () {
		$log = new Log();
		$log->setHeader('Controller::start');		
		$log->add('start');
		$log->add('query: '.$_SERVER['QUERY_STRING']);
		self::getParams();
		self::initModel();
		self::$data = Model::getAllData();
		self::initTheme();
		self::display();
	}
	/**
	 * metoda ma za zadanie pobrać wszelkie parametry oraz zmienne przesłane w nagłówkach oraz pozapisywać je w odpowiednich polach
	 * 
	 * na dzień dzisiejszy pobiera dane z tablicy $_GET, więcej nie potrzeba, choć pewnie wraz z rozrostem projektu będzie musiała pobrać dane z $_POST
	 * czy ciasteczek
	 */
	private static function getParams () {
		$query = $_SERVER['QUERY_STRING'];
		$query = explode('/', $query);
		self::$ad = array_pop($query);
		self::$category = $query;
		$log = new Log('Controller::getParams');
		$log->add('kategoria: '.implode('/', $query));
		$log->add('ogłoszenie: '.self::$ad);
	}
	/**
	 * startuje model
	 * 
	 * robi to w następujący sposób: buduje tablicę z parametrami dla wszystkich modeli i przekazuje ją klasie Model
	 */
	private static function initModel () {
		$data = array();
		if(!self::$category) {
			self::$category = self::$defaultCategory;
		}
		$data['category'] = self::$category;
		$data['ad'] = self::$ad;
		Model::loadModels($data);
	}
	/**
	 * startuje wyświetlanie całej strony
	 */
	private static function initTheme () {
		$log = new Log('Controller::initTheme');
		switch(self::$data['ad']['mode']) {
			case 'category': 
				Theme::init('all', self::$data);
				break;
			case 'single':
				Theme::init('single', self::$data);
		}
		// if(self::$data['ad']['title']) {
		// 	Theme::init('all', self::$data);
		// 	$log->add('theme - all');
		// } else {
		// 	Theme::init('single', self::$data);
		// 	$log->add('theme - single');
		// }
	}
	/**
	 * wyświetla gotową stronę
	 */
	private static function display () {
		$log = new Log();
		$log->setHeader('Controller::display');
		$output = Theme::getHTML();
		$log->add('do wyświetlenia jest: <br /><textarea>'.$output.'</textarea>');
		echo $output;
	}
}
?>